/* Copyright (C) 2010  Romolo Camplani, Marco Fortunato, Marco Marelli, Guido Rota, Fabio A. Schreiber et al.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package org.dei.perla.sys.hlqexecutor;

import org.dei.perla.parser.statements.*;
import org.dei.perla.sys.hlqexecutor.datastructures.Tree;


/**
 * La seguente classe realizza l'esecutore di query di alto livello implementando un design pattern Singleton.
 * @author  Luigi Rinaldi
 */

public class HLQExecutor {
	
	//contiene l'istanza della classe stessa
	/**
	 * @uml.property  name="instance"
	 * @uml.associationEnd  
	 */
	private static HLQExecutor instance = null;
	private Tree<Query> tree;
	private HLQParser parser;

	/**
	 * Costruttore privato per implementare il design pattern Singleton
	 */
	private HLQExecutor() {}
	
	/**
	 * Punto di accesso all' HLQExecutor
	 * @return l'unica istanza dell'oggetto HLQExecutor
	 */
	public static synchronized HLQExecutor getHLQExecutor(){
		if(instance == null)
			instance = new HLQExecutor();
		return instance;
	}
	
	/**
	 * Esegue una query PerLa di alto livello
	 * @param hls
	 */
	public void queryExe(HLStatement hls){
		
		//TODO prima cosa da fare è recuperare l'informazione riguardante il nome della tabella principale che conterrà
		// 	   il risultato finale della query e capire se è necessario crearla nel DB oppure se è stata già crata.
		//     Questa informazioni magari sarbbe meglio averle direttamente nel TreeQuery.
		
		//TODO seconda cosa da fare è capire se le query che l'esecutore sta eseguendo debbano essere registrate in qualche modo da 
		//	   qualche parte. Magari gli Enviroment potevano essere utili a questo scopo.
		//     Per il momento nn registriamo nulla e ipotizziamo il caso in cui ci sia solamente una query da eseguire. In questo caso
		//     le informazioni vengono memorizzate all'interno della classe stessa.
		
		parser = new HLQParser(hls);
		tree = parser.getTreeQuery();
		
		//In tree ho tutte le query strutturate secondo una dipendenza dati e questo punto recuperando le query base attraverso l'iteratore
		//posso eseguirle nel db (ovviamente l'iteratore mi fornisce una query per volta rispettando le dipendenze dati). 
		
		
		
		
		
		
		//Questa parte deve essere spostata nel HLQParser
		/*Duration interval;
		int samples;
		Stream stream;
		
		//TODO ovviamente le info riguardanti le view create dovranno essere opportunamente memorizzate 
		if (hls.getEveryClause() instanceof HLEveryTimeBased){
			interval = ((HLEveryTimeBased) hls.getEveryClause()).getInterval();  
			View view1 = new ViewTimeBased(composeQuerySQL(hls.getUnionClause()), interval);
		}
		else if (hls.getEveryClause() instanceof HLEveryEventBased){
			samples =  ((HLEveryEventBased) hls.getEveryClause()).getSamples();
			stream = ((HLEveryEventBased) hls.getEveryClause()).getStream();
			View view2 = new ViewEventBased(composeQuerySQL(hls.getUnionClause()), new Trigger(stream, samples));
		}*/
	}
}